Completed
Pull Request — develop (#123)
by Xaver
01:03
created

router.js ➔ ... ➔ resetView   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
nc 1
dl 0
loc 5
rs 9.4285
nop 0
1
define(['Navigo'], function (Navigo) {
2
  'use strict';
3
4
  return function (config, language) {
5
    var init = false;
6
    var objects = { nodes: {}, links: {} };
7
    var targets = [];
8
    var views = {};
9
    var current = {};
10
    var state = { language: _.locale(), view: 'map' };
11
12
    function resetView() {
13
      targets.forEach(function (t) {
14
        t.resetView();
15
      });
16
    }
17
18
    function gotoNode(d, update) {
19
      if (d.nodeId in objects.nodes) {
20
        targets.forEach(function (t) {
21
          t.gotoNode(objects.nodes[d.nodeId], update);
22
        });
23
      }
24
    }
25
26
    function gotoLink(d, update) {
27
      if (d.linkId in objects.links) {
28
        targets.forEach(function (t) {
29
          t.gotoLink(objects.links[d.linkId], update);
30
        });
31
      }
32
    }
33
34
    function view(d) {
35
      if (d.view in views) {
36
        views[d.view]();
37
        state.view = d.view;
38
        resetView();
39
      }
40
    }
41
42
    function customRoute(lang, viewValue, node, link, zoom, lat, lng) {
43
      current = {
44
        lang: lang,
45
        view: viewValue,
46
        node: node,
47
        link: link,
48
        zoom: zoom,
49
        lat: lat,
50
        lng: lng
51
      };
52
53
      if (lang && _.locale() !== lang) {
54
        language.setLocale(lang);
55
      }
56
57
      if (!init) {
58
        if (viewValue) {
59
          state.view = viewValue;
60
        }
61
        view({ view: state.view });
62
        init = true;
63
      }
64
65
      if (viewValue && state.view !== viewValue) {
66
        view({ view: viewValue });
67
      }
68
69
      if (node) {
70
        gotoNode({ nodeId: node });
71
      } else if (link) {
72
        gotoLink({ linkId: link });
73
      } else if (lat) {
74
        targets.forEach(function (t) {
75
          t.gotoLocation({
76
            zoom: parseInt(zoom, 10),
77
            lat: parseFloat(lat),
78
            lng: parseFloat(lng)
79
          });
80
        });
81
      } else {
82
        resetView();
83
      }
84
    }
85
86
    var root = null;
87
    var useHash = true;
88
    const router = new Navigo(root, useHash);
89
90
    router
91
      .on(/^\/?#?\/([\w]{2})?\/?(map|graph)?\/?([a-f\d]{12})?([a-f\d\-]{25})?\/?(?:(\d+)\/([\d.]+)\/([\d.]+))?$/, customRoute)
92
      .on({
93
        '*': function () {
94
          router.fullUrl();
95
        }
96
      });
97
98
    router.generateLink = function generateLink(data, full, deep) {
99
      var result = '';
100
101
      if (full) {
102
        data = Object.assign({}, state, data);
103
      } else if (deep) {
104
        data = Object.assign({}, current, data);
105
      }
106
107
      for (var key in data) {
108
        if (!data.hasOwnProperty(key) || data[key] === undefined) {
109
          continue;
110
        }
111
        result += '/' + data[key];
112
      }
113
114
      return useHash ? '#' + result : result;
115
    };
116
117
    router.fullUrl = function fullUrl(data, e) {
118
      if (e) {
119
        e.preventDefault();
120
      }
121
      router.navigate(router.generateLink(data, true, true));
122
    };
123
124
    router.gotoLocation = function gotoLocation(d) {
125
      targets.forEach(function (t) {
126
        t.gotoLocation(d);
127
      });
128
    };
129
130
    router.reset = function reset() {
131
      resetView();
132
    };
133
134
    router.addTarget = function addTarget(d) {
135
      targets.push(d);
136
    };
137
138
    router.removeTarget = function removeTarget(d) {
139
      targets = targets.filter(function (e) {
140
        return d !== e;
141
      });
142
    };
143
144
    router.addView = function addView(k, d) {
145
      views[k] = d;
146
    };
147
148
    router.setData = function setData(data) {
149
      objects.nodes = {};
150
      objects.links = {};
151
152
      data.nodes.all.forEach(function (d) {
153
        objects.nodes[d.nodeinfo.node_id] = d;
154
      });
155
156
      data.graph.links.forEach(function (d) {
157
        objects.links[d.id] = d;
158
      });
159
    };
160
161
    return router;
162
  };
163
});
164